﻿using System.Threading.Tasks;
using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.Owin;
using Microsoft.Owin;
using CloudStorageLight.Web.Models;
using ElCamino.AspNet.Identity.AzureTable;
using ElCamino.AspNet.Identity.AzureTable.Model;
using SendGrid;
using System.Net;
using System.Configuration;
using CloudStorageLight.Core.Web;
using CloudStorageLight.Core;
using System.Net.Mail;

namespace CloudStorageLight.Web
{
    // このアプリケーションで使用されるアプリケーション ユーザー マネージャーを設定します。UserManager は ASP.NET Identity の中で定義されており、このアプリケーションで使用されます。

    public class ApplicationUserManager : UserManager<ApplicationUser>
    {
        public ApplicationUserManager(IUserStore<ApplicationUser> store)
            : base(store)
        {
        }

        public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context) 
        {
            var ctx = context.Get<ApplicationDbContext>();
            return Create(options, ctx);
        }

        public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, ApplicationDbContext ctx)
        {
            var manager = new ApplicationUserManager(new UserStore<ApplicationUser>(ctx));
            // ユーザー名の検証ロジックを設定します
            manager.UserValidator = new UserValidator<ApplicationUser>(manager)
            {
                AllowOnlyAlphanumericUserNames = false,
                RequireUniqueEmail = true
            };
            // パスワードの検証ロジックを設定します
            manager.PasswordValidator = new PasswordValidator
            {
                RequiredLength = 6,
                RequireNonLetterOrDigit = true,
                RequireDigit = true,
                RequireLowercase = true,
                RequireUppercase = true,
            };
            // 2 要素認証プロバイダーを登録します。このアプリケーションでは、Phone and Emails をユーザー検証用コード受け取りのステップとして使用します。
            // 独自のプロバイダーを作成して、ここにプラグインすることができます。
            manager.RegisterTwoFactorProvider("PhoneCode", new PhoneNumberTokenProvider<ApplicationUser>
            {
                MessageFormat = "Your security code is: {0}"
            });
            manager.RegisterTwoFactorProvider("EmailCode", new EmailTokenProvider<ApplicationUser>
            {
                Subject = "セキュリティ コード",
                BodyFormat = "Your security code is: {0}"
            });
            manager.EmailService = new EmailService();
            manager.SmsService = new SmsService();
            var dataProtectionProvider = options.DataProtectionProvider;
            if (dataProtectionProvider != null)
            {
                manager.UserTokenProvider = new DataProtectorTokenProvider<ApplicationUser>(dataProtectionProvider.Create("ASP.NET Identity"));
            }
            return manager;
        }

        public static async Task CreateCloudAccountAsync(string domain=null)
        {
            var azureStore = new UserStore<ApplicationUser>(new ApplicationDbContext(domain));
            await azureStore.CreateTablesIfNotExists();
        }
    }


    public class EmailService : IIdentityMessageService
    {
        public async Task SendAsync(IdentityMessage message)
        {
            var from = new System.Net.Mail.MailAddress(
                                    SystemSettings.Instance.FromMailAddress, "Cloud Storage Light");
            var to = new System.Net.Mail.MailAddress(message.Destination);
            await MailServiceFactory.GetService().SendMailAsync(from, new MailAddress[]{ to }, null, null, message.Subject, message.Body, true);
        }

        //private Task SendMessageBySmtpClientAsync(IdentityMessage message)
        //{
        //    using (var smtpClient = new SmtpClient())
        //    {
        //        var myMessage = new MailMessage();
        //        myMessage.To.Add(message.Destination);
        //        myMessage.From = new System.Net.Mail.MailAddress(
        //                            SystemSettings.Instance.FromMailAddress, "Cloud Storage Light");
        //        myMessage.Subject = message.Subject;
        //        myMessage.IsBodyHtml = true;
        //        myMessage.Body = message.Body;
        //        smtpClient.Send(myMessage);
        //    }
        //    return Task.Delay(0);
        //}

        //private Task SendGridAsync(IdentityMessage message)
        //{
        //    var myMessage = new SendGridMessage();
        //    myMessage.AddTo(message.Destination);
        //    myMessage.From = new System.Net.Mail.MailAddress(
        //                        SystemSettings.Instance.FromMailAddress, "Cloud Storage Light");
        //    myMessage.Subject = message.Subject;
        //    myMessage.Text = message.Body;
        //    myMessage.Html = message.Body;

        //    var credentials = new NetworkCredential(
        //               SystemSettings.Instance.MailUser,SystemSettings.Instance.MailPassword);

        //    // Create a Web transport for sending email.
        //    var transportWeb = new SendGrid.Web(credentials);

        //    // Send the email.
        //    if (transportWeb != null)
        //    {
        //        return transportWeb.DeliverAsync(myMessage);
        //    }
        //    else
        //    {
        //        return Task.FromResult(0);
        //    }
        //}
    }

    public class SmsService : IIdentityMessageService
    {
        public Task SendAsync(IdentityMessage message)
        {
            // テキスト メッセージを送信するには、SMS サービスをここにプラグインします。
            return Task.FromResult(0);
        }
    }
}
